const jwt = require("jsonwebtoken");
const config = require("../config/base");

module.exports = async (ctx, next) => {
  try {
    const authHeader = ctx.headers.authorization;
    if (!authHeader) {
      ctx.status = 401;
      ctx.body = { error: "未提供认证令牌" };
      return;
    }

    const token = authHeader.replace('Bearer ', '').trim();
    const cleanToken = token.replace(/['"]+/g, '');

    try {
      // 尝试验证 token
      const decoded = jwt.verify(cleanToken, config.jwt.secret, {
        ignoreExpiration: false // 显式设置不忽略过期时间
      });

      // 检查 token 是否即将过期（比如还有 30 分钟过期）
      const now = Math.floor(Date.now() / 1000);
      if (decoded.exp - now < 1800) { // 30分钟内过期
        // 生成新的 token，延长有效期
        const newToken = jwt.sign(
          { id: decoded.id, username: decoded.username },
          config.jwt.secret,
          { expiresIn: "168h" } // 明确设置过期时间为168小时
        );
        // 在响应头中返回新的 token
        ctx.set('New-Token', newToken);
      }
      
      ctx.state.user = decoded;
      await next();
    } catch (jwtError) {
      console.error("JWT验证错误:", jwtError);
      if (jwtError.name === 'TokenExpiredError') {
        ctx.status = 401;
        ctx.body = { 
          error: "登录已过期，请重新登录",
          code: "TOKEN_EXPIRED"
        };
      } else {
        ctx.status = 401;
        ctx.body = { 
          error: "无效的认证令牌",
          code: "INVALID_TOKEN"
        };
      }
    }
  } catch (error) {
    console.error("认证中间件错误:", error);
    ctx.status = 500;
    ctx.body = { error: "服务器错误" };
  }
};
